package modelo.traits

import modelo.ResultadoCursada

trait ConEstadistica {
  
  def resultados : List[ResultadoCursada]
  
  def resultadosConAplazos = resultados.filter(_.terminada)
  def resultadosSinAplazos = resultados.filter(c => c.terminada && c.nota > 3)
  def resultadosAprobados = resultados.filter(c => c.terminada && c.nota > 7)
  
  
  def promedioResultados(res : List[ResultadoCursada]) = res.map(_.nota).sum / res.size
  
  def promedioConAplazos = promedioResultados(resultadosConAplazos)
  
  def promedioSinAplazos =  promedioResultados(resultadosSinAplazos)

  def cantidadDeCursadasAprobadas = resultados.count(c => c.terminada && c.nota > 7)
  
  def cantidadDeCursadasAbandonadas = resultados.count(!_.terminada)
  
  def porcentajeDeAprobadosSobreIniciados = (resultadosAprobados.size * 100) / resultados.size
  
  def tablaDeNotas = { // Map(nota,cant)
    resultadosConAplazos.groupBy(_.nota).map { case (nota, resultados) => (nota, resultados.size) }
    
    // Alternativa incluyendo cantidades (ceros) para notas nunca obtenidas:
    //(1 to 10).map(n => (n, resultadosConAplazos.filter(_.nota == n).size)).toMap
  }
  
  def maximaNotaAlcanzadaMinNVeces(minCant : Int) : Int = 
    (1 to 10).map (n => (n, resultadosConAplazos.filter(_.nota >= n).size)).filter(_._2 >= minCant).maxBy(_._1)._1

}
